<?php
require_once ("C_krn_bd_engine.php");
//require_once ("C_krn_exception.php");
class c_MySQLDB {
	
	/* Evitamos el clonaje del objeto. Patrón Singleton */
	private function __clone() {
	}
	private function __wakeup() {
	}
	
	// Identificador de la conexión
	private $Conexion;
	public function getTipoBD() {
		global $MotorBD;
		
		// Obtener el tipo de Base de Datos según el motor
		$r = $MotorBD->getMotor ();
		return $r;
	}
	
	// Funciones get set
	public function getConexion() {
		return $this->Conexion;
	}
	private function setConexion($pConexion) {
		$this->Conexion = $pConexion;
	}
	
	// Numero de usuarios activos
	private $NumUsuariosActivos;
	
	// Funciones get set
	public function getNumUsuariosActivos() {
		return $this->NumUsuariosActivos;
	}
	private function setNumUsuariosActivos($pNumUsuariosActivos) {
		$this->NumUsuariosActivos = $pNumUsuariosActivos;
	}
	
	// Numero de invitados activos
	private $NumInvitadosActivos;
	
	// Funciones get set
	public function getNumInvitadosActivos() {
		return $this->NumInvitadosActivos;
	}
	private function setNumInvitadosActivos($pNumInvitadosActivos) {
		$this->NumInvitadosActivos = $pNumInvitadosActivos;
	}
	
	// Inicialización del la Base de Datos
	function __construct() {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
		
		$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "::constructor (" . __CLASS__ . ")" );
		
		// Nos conectamos a la BD
		$r = $MotorBD->ConectarBD ( BD_SERVIDOR, BD_USUARIO, BD_PASSWORD, BD_NOMBRE );
		
		// Si hay error
		if (! $r) {
			// Error
			$_SESSION ['SESSION_ERROR'] = $language [$IDIOMA] [17];
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $_SESSION ['SESSION_ERROR'] );
			return false;
		}
		
		// Establecemos la conexión
		$this->setConexion ( $r );
		
		// Num usuarios activos
		$this->calcNumUsuariosActivos ();
		
		// Num de invitados activos
		$this->calcNumInvitadosActivos ();
	}
	
	// Calcular el número de usuarios activos
	public function calcNumUsuariosActivos() {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
		
		// Construimos la query
		$q = "SELECT * FROM " . TABLA_USUARIOS . " WHERE userid <> '0';";
		
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$count = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Establecemos el valor
		$this->setNumUsuariosActivos ( $count );
		
		$MotorBD->QueryBDi_LiberarQuery ( $r );
		
		return true;
	}
	
	// Calcular el número de invitados activos
	public function calcNumInvitadosActivos() {
		global $MotorBD;
		
		// Construimos la query
		$q = "SELECT * FROM " . TABLA_INVITADOS . ";";
		
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$count = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Establecemos el valor
		$this->setNumInvitadosActivos ( $count );
		
		$MotorBD->QueryBDi_LiberarQuery ( $r );
		
		return true;
	}
	
	// Borrar los invitados que se encuentren inactivos
	public function BorrarInvitadosInactivos() {
		global $MotorBD;
		
		// La sesion caduca ...
		$t = time () - (TIME_INVITADO * 60);
		
		// Construimos la query
		$q = "DELETE FROM " . TABLA_INVITADOS . " WHERE timestamp < $t;";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Refrescamos los datos
		$this->calcNumInvitadosActivos ();
		
		return true;
	}
	
	// Borrar la BD usuarios que están inactivos más del tiempo eatablecido de inactividad
	public function BorrarUsuariosInactivos() {
		global $MotorBD;
		
		// La sesion caduca en ...
		$t = time () - (TIME_USUARIO * 60);
		
		// Construimos la query
		$q = "UPDATE " . TABLA_USUARIOS . " SET userid = '0' WHERE timestamp < $t;";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Refrescamos los datos
		$this->calcNumUsuariosActivos ();
		
		return true;
	}
	
	// Borrar la BD usuarios que están inactivos más del tiempo eatablecido de inactividad
	public function BorrarUsuariosInactivosPendingActivate() {
		global $MotorBD;
		
		// La HORA ACTUAL
		$t = time () - TIME_PENDING_ACTIVATE;
		
		// Construimos la query
		$q = "DELETE FROM " . TABLA_USUARIOS . " WHERE STATUS = 'PENDING_ACTIVATE' AND ".$t." >= STATUS_TIME;";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Refrescamos los datos
		$this->calcNumUsuariosActivos ();
		
		return true;
	}
	
	// Buscar un invitado activo
	public function BuscarInvitadoActivo($pIP, $pID) {
		global $MotorBD;
		
		// Construimos la query
		$q = "SELECT * FROM " . TABLA_INVITADOS . " WHERE ip = '$pIP' and id = '$pID';";
		
		// Ejecutamos la query y obtenemos el nÚmero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$count = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		$MotorBD->QueryBDi_LiberarQuery ( $r );
		
		// Si hay invitados
		return ($count > 0);
	}
	
	// Añadimos un invitado activo
	public function AnadirInvitadoActivo($pIP, $pID, $pTIME) {
		global $MotorBD;
		
		// Construimos la query
		$q = "INSERT INTO " . TABLA_INVITADOS . " ( IP, ID, TIMESTAMP ) VALUES ('" . $pIP . "', '" . $pID . "', '" . $pTIME . "' )";
		
		// Ejecutamos la query y obtenemos el nÚmero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Calcular el numero de invitados activos
		$this->calcNumInvitadosActivos ();
		
		return true;
	}
	
	public function getncodUsuario ( $pEMAIL ) {
	  global $MotorBD;
	  
	  // Código de usuario 0 --> error
	  // 1 --> admin
	  // 2 --> u1 .....
	  
		// Construimos la query
		$q = "SELECT ncod_usuario FROM " . TABLA_USUARIOS . " WHERE email = '" . $pEMAIL . "';";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Obtenemos los datos de la tabla
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		return stripslashes ( $ret ['ncod_usuario'] );
	
	}
	
	// Calcular el número veces que se ha conectado
	public function getCountUsuario ( $pEMAIL ) {
		global $MotorBD;
		
		// Obtenemos el codigo del usuario en vez del el email
		$ncod_usuario = get_ncodUsuario ( $pEMAIL );
		echo $ncod_usuario;die;
		// Construimos la query
		$q = "SELECT count FROM " . TABLA_USUARIOS . " WHERE email = '" . $pEMAIL . "';";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Obtenemos los datos de la tabla
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		return stripslashes ( $ret ['count'] );
	}
	
	public function BloquearUsuario ( $pEMAIL ) {
	
	  // Bloquear el usuario
	  $status = unserialize ( LOGIN_STATUS );
	  $this->ActualizarCampo ( TABLA_USUARIOS, 'status',      $status[2], 'email', $pEMAIL );
	  $this->ActualizarCampo ( TABLA_USUARIOS, 'status_time', time(), 'email', $pEMAIL );
	  
	  return true;
			
	}
	
	public function DesBloquearUsuario ( $pEMAIL ) {
	
	  // DesBloquear el usuario
	  $status = unserialize ( LOGIN_STATUS );
	  $this->ActualizarCampo ( TABLA_USUARIOS, 'status',      $status[0], 'email', $pEMAIL );
	  $this->ActualizarCampo ( TABLA_USUARIOS, 'status_time', time(), 'email', $pEMAIL );
	  
	  return true;
			
	}

	public function DesconexionUsuario ( $pEMAIL ) {
	
	  // Desconexión el usuario
	  $status = unserialize ( LOGIN_STATUS );
	  $this->ActualizarCampo ( TABLA_USUARIOS, 'status',      $status[1], 'email', $pEMAIL );
	  $this->ActualizarCampo ( TABLA_USUARIOS, 'status_time', time(), 'email', $pEMAIL );
	  
	  return true;
			
	}	
	
	// El acceso ha sido erróneo
	public function LastLoginFAIL($pEMAIL) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
		
		// Antes de insertar comprobamos si el campo de LAST_LOGIN_FAIL esta relleno, si lo está solo incrementamos el contador
		// Para poder saber cuanto tiempo hace que ha empezado a fallar
		
		// Construimos la query
		$q = "SELECT FIRST_LOGIN_FAIL, LOGIN_FAIL FROM " . TABLA_USUARIOS . " WHERE email = '" . $pEMAIL . "'";
		
		// Ejecutamos la query y obtenemos el nÚmero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Accedemos a los datos
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		// Si tiene datos, solo incrementamos el contador
		if ($ret ['FIRST_LOGIN_FAIL'] != 0) {
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "[ " . $pEMAIL . " ] LOGIN_FAIL: " . ($ret ['LOGIN_FAIL'] + 1) . " - FIRST_LOGIN_FAIL: ( " . date ( "d/m/Y - H:i:s", $ret ['FIRST_LOGIN_FAIL'] ) . " ) Time: " . (time () - $ret ['FIRST_LOGIN_FAIL']) );
			$q = "UPDATE " . TABLA_USUARIOS . " SET LOGIN_FAIL=LOGIN_FAIL+1 WHERE email = '" . $pEMAIL . "'";
		} else {
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "[ " . $pEMAIL . " ] LOGIN_FAIL: 1 - FIRST_LOGIN_FAIL: ( " . date ( "d/m/Y - H:i:s", time () ) . " )" );
			$q = "UPDATE " . TABLA_USUARIOS . " SET FIRST_LOGIN_FAIL =  '" . time () . "', LOGIN_FAIL=1 WHERE email = '" . $pEMAIL . "'";
		}
		
		// Ejecutamos la query y obtenemos el nÚmero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		if (((time () - $ret ['FIRST_LOGIN_FAIL']) < LOGIN_MAX_INTENTOS_TIME) && ($ret ['LOGIN_FAIL'] >= LOGIN_MAX_INTENTOS)) {
			// Si han pasado menos de 24h y hay más de X intentos se bloqueará el usuario
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "WARNING [ " . $pEMAIL . " ] - [ " . $ret ['LOGIN_FAIL'] . " ] " . $language [$IDIOMA] [48] );
		  $this->BloquearUsuario ( $pEMAIL );
		} else if ($ret ['LOGIN_FAIL'] >= LOGIN_MAX_INTENTOS + 1) {
		  // Si han pasado más de 24 horas se permite un intento más y además si se falla otra vez se bloqueará el usuario
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "WARNING [ " . $pEMAIL . " ] - [ " . $ret ['LOGIN_FAIL'] . " ] " . $language [$IDIOMA] [49] );
		  $this->BloquearUsuario ( $pEMAIL );
		} 
		return false;
	}
	
	public function LastLoginOK($pEMAIL) {
		global $MotorBD;
		
		// Construimos la query
		$q = "UPDATE " . TABLA_USUARIOS . " SET FIRST_LOGIN_FAIL = '0', LOGIN_FAIL=0, COUNT=COUNT+1 WHERE email = '" . $pEMAIL . "'";
		// Ejecutamos la query y obtenemos el nÚmero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		return true;
	}
	
	// Obtiene la información del usuario solicitado
	public function getInfoUsuario($pEMAIL) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
		// Construimos la query
		$q = "SELECT * FROM " . TABLA_USUARIOS . " WHERE email = '$pEMAIL';";
		
		// Ejecutamos la query y obtenemos el n�mero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// No existe el usuario
		if (! $r || ($n < 1)) {
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [18] );
			return false;
		}
		
		// Obtenemos los datos de la BD
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		return $ret;
	}
	
	// Actualiza un campo de una tabla
	public function ActualizarCampo($pTABLA, $pCAMPO, $pVALOR, $pWHERE, $pEMAIL) {
		global $MotorBD;
		
		// Construimos la query
		$q = "UPDATE " . $pTABLA . " SET " . $pCAMPO . " = '$pVALOR' WHERE " . $pWHERE . " = '$pEMAIL'";
		
		// Ejecutamos la query
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		return $r;
	}
	
	// Get un campo de una tabla
	public function GetCampo($pTABLA, $pCAMPO, $pWHERE, $pEMAIL) {
		global $MotorBD;
		
		// Construimos la query
		$q = "SELECT " . $pCAMPO . " FROM " . $pTABLA . " WHERE " . $pWHERE . " = '" . $pEMAIL. "';";
		
		// Ejecutamos la query
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );

		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Obtenemos los datos de la tabla
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		return $ret;
	}
	
	// Get un campo de una tabla
	public function GetCampoWhereExtendido($pTABLA, $pCAMPO, $pWHERE ) {
		global $MotorBD;
		
		// Construimos la query
		$q = "SELECT " . $pCAMPO . " FROM " . $pTABLA . " WHERE " . $pWHERE . ";";
		
		// Ejecutamos la query
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );

		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Obtenemos los datos de la tabla
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		return $ret;
	}
	
	// Actualiza un campo de una tabla
	public function ActualizarCampoCount($pTABLA, $pCAMPO, $pVALOR, $pWHERE, $pEMAIL) {
		global $MotorBD;
		
		// Construimos la query
		$q = "UPDATE " . $pTABLA . " SET " . $pCAMPO . " = $pVALOR WHERE " . $pWHERE . " = '$pEMAIL'";
		
		// Ejecutamos la query
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		return $r;
	}
	
	// Añadimos un usuario activo
	public function AnadirUsuarioActivo($pEMAIL, $pTIME) {
		global $MotorBD;
		
		// Construimos la query
		$q = "UPDATE " . TABLA_USUARIOS . " SET timestamp = '$pTIME' WHERE email = '$pEMAIL'";
		
		// Ejecutamos la query
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Actualizar numero de usuario
		$this->calcNumUsuariosActivos ();
		
		return true;
	}
	
	// Borra invitado activo por su id
	public function BorrarInvitadoActivo($pID) {
		global $MotorBD;
		
		// Construir la query
		$q = "DELETE FROM " . TABLA_INVITADOS . " WHERE id = '$pID' ";
		
		// Ejecutamos la query
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Actualizar numero de invitados activos
		$this->calcNumInvitadosActivos ();
		
		return true;
	}
	
	// Comprueba el id del usuario contra la BD
	public function confirmarUsuarioID($pEMAIL, $pPASSWORD) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
		
		if (! get_magic_quotes_gpc ()) {
			$pEMAIL = addslashes ( $pEMAIL );
			$pPASSWORD = addslashes ( $pPASSWORD );
		}
		
		// Construimos la query
		$q = "SELECT * FROM " . TABLA_USUARIOS . " WHERE email = '$pEMAIL' and passw='$pPASSWORD';";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// No existe el usuario
		if (! $r || ($n < 1)) {
			$_SESSION ['SESSION_ERROR'] = $language [$IDIOMA] [50];
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [50] );
			
			return false;
		} else {
			// Obtenemos los datos de la BD
			$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
			return $ret;
		}
	}
	
	public function ConfirmarUsuarioDispositivoAplicacion ( $app, $modo, $email ) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
				
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "Us: " . $email . "Modo: ". $modo . "App: ". $app  );
			
		// Construimos la query
		$q  = "SELECT * "; 
    $q .= "FROM ". TABLA_APLICACIONES . " ap, ";
    $q .= "     ". TABLA_MODOS_APP    . " ma, ";
    $q .= "     ". TABLA_USUARIOS     . " us, ";
    $q .= "     ". TABLA_USUARIO_APP  . " ua  ";
    $q .= "WHERE ap.ncod_aplicacion = ". $app. " ";
    $q .= "AND   ma.modo_acceso = '". $modo. "' ";
    $q .= "AND   us.email = '". $email. "' ";
    $q .= "AND   us.ncod_usuario = ua.ncod_usuario ";
    $q .= "AND   ap.ncod_aplicacion = ua.ncod_aplicacion ";
    $q .= "AND   ma.ncod_modo = ua.ncod_modo ";
    
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $q  );
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// No existe el usuario
		if (! $r || ($n < 1)) {
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [111] );
			return false;
		} else {
			return true;
		}
	}
	
	public function Counter($GRAFICAL) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
		
		// Iniciamos el contador
		$count = 0;
		
		// Count unique visitors? 1 = YES, 0 = NO
		$count_unique = 0;
		
		// Number of hours a visitor is considered as "unique"
		$unique_hours = 24;
		
		// Minimum number of digits shown (zero-padding). Set to 0 to disable.
		$min_digits = 7;
		
		/* Set values for cookie, log file and style flye names */
		$cookie_name = COUNTER_COOKIE . '_unique';
		
		// Lanzamos la consulta a la Base de datos
		$q = "SELECT parameter, value FROM t_aplicacion where parameter = 'VISITAS_CONTADOR';";
		
		// Ejecutamos la query y obtenemos el numero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$c = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Error en el cursor
		if (! $r) {
			$count = 0;
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [64] );
		} else if ($c == 0) {
			// No hay registror insertar uno nuevo
			$count = 0;
			
			/* If counting unique hits is enabled make sure it's a unique hit */
			if ($count_unique == 0 || ! isset ( $_COOKIE [$cookie_name] )) {
				$qq = "UPDATE t_aplicacion set value = " . $count . " where parameter = 'VISITAS_CONTADOR';";
				$rr = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $qq );
				
				$qq = "UPDATE t_aplicacion set value = " . time () . " where parameter = 'VISITAS_LAST';";
				$rr = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $qq );
				
				/* Print the Cookie and P3P compact privacy policy */
				setcookie ( $cookie_name, 1, time () + 60 * 60 * $unique_hours );
			}
		} else {
			
			// Obtenemos los datos de la BD
			$d = $MotorBD->mysql_query_fetch_ROW ( $r, $c );
			
			$count = $d ['value'];
			
			/* If counting unique hits is enabled make sure it's a unique hit */
			if ($count_unique == 0 || ! isset ( $_COOKIE [$cookie_name] )) {
				
				$count = $count + 1;
				/* utilizar el procedimiento de actualziar un campo de una bd */
				$qq = "UPDATE t_aplicacion SET value = '" . $count . "' where parameter = 'VISITAS_CONTADOR' LIMIT 1 ;";
				$rr = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $qq );
				
				$qq = "UPDATE t_aplicacion SET value = '" . time () . "' where parameter = 'VISITAS_LAST' LIMIT 1 ;";
				$rr = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $qq );
				
				/* Print the Cookie and P3P compact privacy policy */
				setcookie ( $cookie_name, 1, time () + 60 * 60 * $unique_hours );
			}
		}
		
		if ($GRAFICAL == 1) {
			
			/* Is zero-padding enabled? If yes, add zeros if required */
			if ($min_digits) {
				$count = sprintf ( '%0' . $min_digits . 's', $count );
			}
			
			/* Print out Javascript code and exit */
			$len = strlen ( $count );
			$contador = '';
			for($i = 0; $i < $len; $i ++) {
				$contador .= '<img src="images/contador/' . substr ( $count, $i, 1 ) . '.gif" height="15" border="0" />';
			}
		} else {
			$contador = $count;
			$contador = $language [$IDIOMA] [65] . $contador;
		}
		
		return $contador;
	}
	
	// Buscar usuario por email
	public function UserFindEmail($pEMAIL) {
		global $MotorBD;
		
		// Construimos la query
		$q = "SELECT * FROM " . TABLA_USUARIOS . " WHERE email = '$pEMAIL';";
		
		// Ejecutar la consulta
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Calculamos el número de filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Liberar Query
		$MotorBD->QueryBDi_LiberarQuery ( $r );
		
		return $n;
	}
	
	// Calcular el número veces que se ha conectado
	public function CountMaxNCodUsuarios ( ) {
		global $MotorBD;
		
		// Construimos la query
		$q = "SELECT max(ncod_usuario) FROM " . TABLA_USUARIOS . ";";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Obtenemos los datos de la tabla
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		return stripslashes ( $ret [0] );
	}
	
	// Buscar usuario por email
	public function CreateUser($pEMAIL, $password ) {
		global $MotorBD;
		
		// Creamos un codigo de usuario más
		$ncod = $this->CountMaxNCodUsuarios ( ) + 1;
		
		$parts = explode("@",$pEMAIL);
    $username = $parts[0];
		
		// Construimos la query
		$q = "INSERT INTO " . TABLA_USUARIOS . " (ncod_usuario, USER, email ,PASSW ,NOMBRE ,APE1 ,APE2 ,USERID ,TIMESTAMP ,TIPO ,COUNT ,FIRST_LOGIN_FAIL ,LOGIN_FAIL ,status ,status_time) ";
		$q .=                           " VALUES (".$ncod.", ".
		                                       " '".$username."', ".
		                                       " '".$pEMAIL."', ".
		                                       " '".md5($password)."', ".
		                                       " '".$pEMAIL."', ".
		                                       " '".$pEMAIL."', ".
		                                       " '".$pEMAIL."', ".
		                                       " '0', ".
		                                       " 0, ".
		                                       " 1, ".
		                                       " 0, ".
		                                       " 0, ".
		                                       " 0, ".
		                                       " 'PENDING_ACTIVATE', ".
		                                       " ".time()." )" ;
		
		// Ejecutar la consulta
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Calculamos el número de filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Liberar Query
		// $MotorBD->QueryBDi_LiberarQuery ( $r );
		
		return $n;
	}
	
		// Añadimos un invitado activo
	public function InsertConexion(
	                               $c01, $c02, $c03, $c04, $c05, 
	                               $c06, $c07, $c08, $c09, $c10, 
	                               $c11, $c12, $c13, $c14, $c15, 
	                               $c16, $c17, $c18, $c19, $c20,
	                               $c21, $c22, $c23 ) {
		global $MotorBD;
			
		// Construimos la query
		$q = "INSERT INTO " . TABLA_CONEXION . " ( ".
		     "ncod_datetime ,".
		     "IO_OPERATION ,".
		     "IO_PA_USERNAME ,".
		     "IO_PA_PASSWORD ,".
		     "ID_VERSION_RELEASE ,".
         "ID_HARDWARE ,".
         "ID_UNKNOWN ,".
         "ID_VERSION_SDK ,".
         "ID_PRODUCT ,".
         "ID_DISPLAY ,".
         "ID_USER ,".
         "ID_HOST ,".
         "ID_DEVICE ,".
         "ID_MODEL ,".
         "ID_CPU_ABI ,".
         "ID_OS_VERSION ,".
         "ID_CPU_ABI2 ,".
         "ID_ID ,".
         "ID_VERSION_INCREMENTAL ,".
         "ID_MANUFACTURER ,".
         "ID_BRAND ,".
		     "IP_VERSION ,".
		     "IP_NAME ,".
		     "ID_APP".
		     " ) VALUES ( '".
		     date('Y-m-d H:m:i',time()). "', '" . $c01 . "',  '" . $c02 . "',  '" . $c03 . "',  '" . $c04 . "',  '" . $c05. "',  '" . 
		                                          $c06 . "',   " . $c07 . " ,  '" . $c08 . "',  '" . $c09 . "',  '" . $c10 . "',  '" . 
		                                          $c11 . "',  '" . $c12 . "',  '" . $c13 . "',  '" . $c14 . "',  '" . $c15. "',  '" . 
		                                          $c16 . "',  '" . $c17 . "',  '" . $c18 . "',  '" . $c19 . "',  '" . $c20 . "',  '" . 
		                                          $c21 . "',  '" . $c22 . "',   " . $c23 . " );";
       
		// Ejecutamos la query y obtenemos el nÚmero de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		return true;
	}

	public function getEstaLogueadoEnBD ( $email ) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
		
		// Obtenemos el tiempo del usuario
		// Logueado si:
		//   userid  <> 0 y timestamp + ( time_usuario * 60 ) < horaactual
		$campo_timestamp = $this->GetCampoWhereExtendido( TABLA_USUARIOS , "timestamp", "email='$email'");	
		$campo_userid    = $this->GetCampoWhereExtendido( TABLA_USUARIOS , "userid",    "email='$email'");	
		
		// Extraemos el campo de la tabla
		$timestamp = $campo_timestamp['timestamp'];
		$userid = $campo_userid['userid'];
		
		 // Hora Actual
	  $HoraActual = time();
	  
	  /*
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "userid<>0:       " . $userid);
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "HoraActual:      " . $HoraActual );
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "TimeStamp:       " . $timestamp );
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "HA >= TS:        " . ($HoraActual >= $timestamp) );
 	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "TIME*60:         " . (TIME_USUARIO * 60 ));
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "TS+(TIME*60):    " . ($timestamp + (TIME_USUARIO * 60)) );
	  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "HA<=TS+(TIME*60):" . ($HoraActual <= ($timestamp + (TIME_USUARIO * 60))));
	   
		// La sesion caduca en $timestamp + (TIME_USUARIO * 60)
		
		if ($userid <> '0') 
		  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "1");
		if ($HoraActual >= $timestamp) 
		  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "2");
		if ($HoraActual <= ($timestamp + (TIME_USUARIO * 60)))
		  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "3");
		*/
		
		if (($userid <> '0') && ( ($HoraActual >= $timestamp) && ($HoraActual <= ($timestamp + (TIME_USUARIO * 60))))) {
		  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "User: $email Logueado? TRUE");
		  return true;
		} else {
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "User: $email Logueado? FALSE");
		  return false;
		}
	}
	
  private function CargarElementoListasDeLaCompra ( $i ) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
    
    // Construimos la query
		$q = "SELECT ncod_interno, ades_corta, datetime_creacion, datetime_update, shared, count FROM " . TABLA_LISTA_COMPRA . " WHERE NCOD_INTERNO = $i";

		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		// Solo debe devolver un elemento de la lista
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
			  
		// No existe el elemento de la lista
		if (! $r || ($n < 1)) {
			return false;
		} else {
			// Obtenemos los datos de la BD
			while ($ret = $MotorBD->mysql_query_fetch_ROW ( $r, 1 )) {
			  $row = $ret;
			}
			return $row;
		}
  }
	
	public function CrearNuevaListaCompra ( $email, $name, $shared ) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;

	  // Primero buscamos si la lista ya existe en la BD
	  $name = trim ( strtolower ( $name ) );

    // Construimos la query
		$q  = "SELECT ";
		$q .="   lc.ncod_interno, lc.ades_corta, lc.datetime_creacion, lc.datetime_update, lc.shared, lc.count ";
		$q .= "FROM ";
		$q .= "  ".TABLA_USUARIOS." u, ";
		$q .= "  ".TABLA_LISTA_USUARIO." lu, ";
		$q .= "  ".TABLA_LISTA_COMPRA." lc ";
		$q .= "WHERE ";
		$q .= "      u.email = '".$email."' ";
		$q .= "  and lu.ncod_usuario = u.ncod_usuario ";
		$q .= "  and lc.ncod_interno = lu.ncod_lista ";
		$q .= "  and lower(lc.ades_corta) = '".$name."' ";

  	// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Obtenemos los datos de la tabla
		//$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		// Si hay 0 se puede insertar la nueva lista
		if ($n == 0) {
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [110] . $email . " - " . $name . " - " . $shared );
			$ret = $this->InsertarNuevaLista ( $email, $name, $shared );
		} else {
		  // Error, no se puede insertar
		  $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [109] . $email . " - " . $name . " - " . $shared );
		  $ret = 1;
		}
		return $ret;
  }
	
	// Calcular el número veces que se ha conectado
	public function CountMaxListas ( ) {
		global $MotorBD;
		
		// Construimos la query
		$q = "SELECT max(ncod_interno) FROM " . TABLA_LISTA_COMPRA . ";";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Obtenemos los datos de la tabla
		$ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
		
		return stripslashes ( $ret [0] );
	}
	
	public function InsertarNuevaLista  ( $email, $name, $shared ) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;
    
    // Obtenemos el total de listas
    $nuevaLista=$this->CountMaxListas() + 1;
    
    // Construimos la query
		$q  = "INSERT INTO " . TABLA_LISTA_COMPRA . " ( " ;
		$q .= "  ncod_interno, ades_corta, datetime_creacion, datetime_update, shared, count ";
		$q .= "  ) VALUES ( ";
		$q .= "  " . $nuevaLista . ", ";
		$q .= "  '" . $name . "', ";
		$q .= "  '" . date('Y-m-d H:m:i',time()) . "', ";
		$q .= "  '" . date('Y-m-d H:m:i',time()) . "', ";
		if ($shared == "true")
		  $q .= "  " . 1 . ", ";
		else
		  $q .= "  " . 0 . ", ";
		$q .= "  " . 0 . " ";
		$q .= "         );";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		// Solo debe devolver un elemento de la lista
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
			  
		// No existe el elemento de la lista
		if (! $r || ($n < 1)) {
				return 2;
		} else {
		  // Ahora insertamos la relación en la lista
		  
		  // Codigo de usuario del email
		  $codigoUsuario=$this->getncodUsuario( $email);
	
		  // Construimos la query
		  $q  = "INSERT INTO " . TABLA_LISTA_USUARIO . " ( " ;
		  $q .= "  ncod_usuario, ncod_lista ";
		  $q .= "  ) VALUES ( ";
 		  $q .= "  " . $codigoUsuario . ", ";
		  $q .= "  " . $nuevaLista . " ";
		  $q .= "         );";
		  
		  // Ejecutamos la query y obtenemos el número de filas en $n
		  $r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );

		  // Número de Filas
		  // Solo debe devolver un elemento de la lista
		  $n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );

		  // No existe el elemento de la lista
		  if (! $r || ($n < 1)) {
			  return 3;
		  } else {
			  return 0;
			}
		}
	}
	
	public function CargarListasDeLaCompra ( $email ) {
		global $MotorBD;
		global $cAUDIT;
		global $IDIOMA, $language;

    // Buscar el ncod_usuario del email
    $ncod = $this->getncodUsuario ( $email );

    // Construimos la query
		$q = "SELECT NCOD_LISTA FROM " . TABLA_LISTA_USUARIO . " WHERE NCOD_USUARIO = $ncod";

		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		// Mostramos los resultados obtenidos (totales)
		$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [96] . "( ". $email . " ) = " . $n );
	  
		// No existe la lista
		if (! $r || ($n < 1)) {
			return false;
		} else {
	    $ret = null;
	    	    
	    // Creamos un array cuando son N filas
      $miLista = array(); // creo el array
      
      $miElementoJSON = array();
      
			// Obtenemos los datos de la BD
			while ($ret = $MotorBD->mysql_query_fetch_ROW ( $r, $n )) {
			  
			  // Añadir un elemento a la lista
			  array_push($miLista, intval($ret[0]));
			  
			  // Por cada elemento extraemos sus caracteristicas
			  $miElemento = $this->CargarElementoListasDeLaCompra ( intval($ret[0] ) );
			  
			  $miElementoARRAY = array( 'ID' => intval($ret[0]), 
			  												  'DESCRIPTION' => $miElemento['ades_corta'],
			  												  'CREATED' =>     $miElemento['datetime_creacion'],
			  											  	'UPDATED' =>     $miElemento['datetime_update'],
			  											  	'SHARED' =>      $miElemento['shared'],
			  											  	'COUNT' =>       $miElemento['count'] );		
			  												 
			  array_push ( $miElementoJSON, $miElementoARRAY );
			}
			
			// Ahora que tenemos cada elemento de la lista debemos extraer todas las propiedades de cada elemento
			$miLista = array( 'ListaDeLaCompra' => $miElementoJSON,
			                  'Total' => $n );
			
			return $miLista;
		}
  }
	
	/* ************************************* GESTION PARA EL ADMINISTRADOR ***************************************************** */

  	// Cargar las pestañas 
  	public function Load_Open ( $q, &$r, &$n ) {
      
      global $MotorBD;
  		
  		// Ejecutar la consulta
  		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion(), $q );

      // Calculamos el número de filas
      $n = $MotorBD->QueryBDi_Filas ( $this->getConexion() );

      return true;
  	}
  	
  	// Cargar las pestañas 
  	public function Load_Fetch ( $r, $n ) {
      
      global $MotorBD;
       
      // Accedemos a cada fila
      $row = $MotorBD->mysql_query_fetch_ROW ( $r, $n );
      
      return $row;
  	}
  	
  	// Cargar las pestañas 
  	public function Load_Close ( $r ) {
      
      global $MotorBD;
             
      // Liberar Query
      $MotorBD->QueryBDi_LiberarQuery ( $r );
      
      return true;
  	}
  	
  	public function CargarTabla ( $pT ) {
  		global $cAUDIT;
  		
  		$r = '';
  		
  		$r = $r . '<table class="footable">' . "\n";
			$r = $r . '<thead>' . "\n";
			$r = $r . '	<tr>' . "\n";
			
			// Crear las columnas

      //Por cada pestaña tenemos que crear su capa más tarde la mostraremos
      // Capa de cada Tabla
      // Accedmos a la base de datos para mostrar las pestañas
	    $this->Load_Open  ( "SELECT column_name, column_comment, data_type, column_type FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".APPLICATION_NAME."' and TABLE_NAME = '". $pT ."' ORDER BY ORDINAL_POSITION;" , $recurso_capa, $total_capa );
	    
	    // Array que almacenará los indices de los campos que son spatial
	    $spatial = array();
	    
	    // Para generar la siguiente secuenca SQL
	    $row_select = '';
	    // Por cada tabla empezamos a hacer las columnas
	    for ($j = 1; $j <= $total_capa; $j++) {
				    	
				    // Accedemos para mostrar todos los campos de cada tabla
				    $row_capa = $this->Load_Fetch ( $recurso_capa, $total_capa );
				    
				    // Sentencia SQL
				    if ($j < $total_capa)
				      $row_select = $row_select . $row_capa['column_name'].', ';
				    else 
				      $row_select = $row_select . $row_capa['column_name'].' ';
			
			      $r = $r . '	  <th data-class="expand" data-sort-initial="true">' . "\n";
			      $r = $r . '		<span title="'.$row_capa['column_name'].'">'.$row_capa['column_comment'].'<br />('.$row_capa["column_name"].')</span>' . "\n";
			      $r = $r . '	  </th>' . "\n";
			      
			      // Si el campo es geometry lo almacenamos en el array correspondiente
			      if ($row_capa["column_type"] == 'geometry') {
			      	array_push($spatial,$j);
			      	//echo $row_capa['column_name']."<br />";
			      }			      

			}

	    // Cerramos la obtención de las columnas de cada tabla
	    $this->Load_Close ( $recurso_capa ); 
			
			// Fin crear columnas
			$r = $r . '	</tr>' . "\n";
			$r = $r . '  </thead>' . "\n";
			$r = $r . '	<tbody>' . "\n";

      // Accedemos a cada tabla
      //echo "SELECT ".$row_select." FROM ".$pT.";<br />";
      // ORDENAMOS POR EL CAMPO 1 PORQUE en la t_conexión el primer campo es datetime, así podemos ver las últimas conexiones.
      $this->Load_Open  ( "SELECT ".$row_select." FROM ".$pT." ORDER BY 1 DESC;" , $recurso_capa_content, $total_capa_content );

          // Mostramos la tabla
          if ($total_capa_content == 0) {
            $r = $r . '  <tr><td colspan="'.$total_capa.'">Sin registros</td></tr>' . "\n";
          }
          
				  for ($k = 1; $k <= $total_capa_content; $k++) {
				    // Accedemos para mostrar todos los campos de cada tabla
				    $row_capa_content = $this->Load_Fetch ( $recurso_capa_content, $total_capa_content );
				    
				    $r = $r . '  <tr>' . "\n";
				    
				    for ($m = 0; $m < $total_capa; $m++) {

						  // es un campo fecha				      
				      if (gmdate($row_capa_content[$m]) && (($row_capa_content[$m] > FECHA_ACTIVACION))) {
				         //echo "*".$row_capa_content[$m]."*<br />";
				         $r = $r . '  <td>'.date ( "d/m/Y-H:i:s", $row_capa_content[$m]).'</td>' . "\n";
				      } else if (in_array( $m+1, $spatial)) {
				         // si es un campo spatial
				    	   $r = $r . '  <td><b>TIPO_GEOMETRICO</b></td>' . "\n";
              } else
				    	   $r = $r . '  <td>'.$row_capa_content[$m].'</td>' . "\n";
				    }

				    $r = $r . '  </tr>' . "\n";
					      
          }
      
      $this->Load_Close ( $recurso_capa_content );

			$r = $r . '  </tbody>' . "\n";
			$r = $r . '</table>' . "\n";
  		
  		return $r;
  	}
  	
  	public function CapaCargarTabla ( $pTABLA, $pACTIVE, $pINDICE ) {
  		
  		$r = '';

  		// Comprobamos que pestaña estará activa
  		if ($pACTIVE == '')
  		   $r = $r . '<div class="tab-pane" id="table'.$pINDICE.'"> ' . "\n";
  		else
  		   $r = $r . '<div class="tab-pane active" id="table'.$pINDICE.'"> ' . "\n";
  		   
  		$r = $r . $this->CargarTabla ( $pTABLA );
  		$r = $r . '</div>' . "\n";
  		
  		return $r;
  	}
  	
  	public function CrearPestanas () {
  		
  		$r = '';
  		
  		// Accedmos a la base de datos para mostrar las pestañas
		  $this->Load_Open  ( "SELECT * FROM " . TABLA_ADMIN . ';' , $recurso, $total );
  		
  		$r = $r . '<ul class="nav nav-tabs" id="myTab">' . "\n";
  		
  		$rt = '';
  		for ($i = 1; $i <= $total; $i++) {
          $row = $this->Load_Fetch ( $recurso, $total );

          if ($i == 1)
            $active = 'class="active"';
          else
            $active = '';
            
          // Generamos la pestaña
          $r = $r . ' 		<li '. $active .'><a href="#table'.$i.'">'.$row['ades_alias'].'</a></li>'."\n";        
          
          // Por cada pestaña cargamos su tabla $row['ades_larga'] --> representa la tabla a cargar
          $rt = $rt . $this->CapaCargarTabla ( $row['ades_larga'], $active, $i );
          
      }

      $r = $r . '</ul>' . "\n";  		

      // Capa que envuelve las pestanas
      $rt_div = '<div class="tab-content">'."\n";
      $rt_div = $rt_div . $rt;
      $rt_div = $rt_div . '</div>'."\n";
      
      $r = $r . $rt_div;
      
  		// Cerramos el recurso de las pestañas
  		$this->Load_Close ( $recurso );
  		
  		return $r;
  	}
  	
	public function ActivarUser( $email ) {
		global $MotorBD;
		
		// Construimos la query
		$q = "UPDATE " . TABLA_USUARIOS . " SET status = 'INACTIVE' WHERE email = '$email' and status='PENDING_ACTIVATE';";
		
		// Ejecutamos la query y obtenemos el número de filas en $n
		$r = $MotorBD->QueryBDi_Execute ( $this->getConexion (), $q );
		
		// Número de Filas
		$n = $MotorBD->QueryBDi_Filas ( $this->getConexion () );
		
		return $n;
	}
  	
 
  	private static $_instance;
	public static function getInstance() {
		if (! (self::$_instance instanceof self)) {
			self::$_instance = new self ();
		}
		return self::$_instance;
	}
}
;

// Instancia de la clase
// $BD = new c_MySQLDB;
try {
	$BD = c_MySQLDB::getInstance ();
} catch ( Exception $e ) {
	global $cAUDIT;
	global $IDIOMA, $language;
	
	$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [2] . $e->getMessage () );
}

?>
